# -*- coding: utf-8 -*-

"""
@author: 猿小天
@contact: QQ:1638245306
@Created on: 2021/6/1 001 22:38
@Remark: 菜单模块
"""
from django.conf import settings
from django.db.models import Q
from rest_framework import serializers

from super.system.models import Menu, MenuButton, Button
from super.system.views.menu_button import MenuButtonSerializer
from super.utils.filtersets import DataLevelPermissionsFilter, get_filters, MenuFilterBackend
from super.utils.json_response import SuccessResponse
from super.utils.serializers import CustomModelSerializer
from super.utils.viewset import CustomModelViewSet


class MenuSerializer(CustomModelSerializer):
    """
    菜单表的简单序列化器
    """
    menuPermission = serializers.SerializerMethodField(read_only=True)

    def get_menuPermission(self, instance):
        queryset = MenuButton.objects.filter(menu=instance.id).order_by('-name').values_list('name', flat=True)
        if queryset:
            return queryset
        else:
            return None

    class Meta:
        model = Menu
        fields = "__all__"
        read_only_fields = ["id"]


class MenuCreateSerializer(CustomModelSerializer):
    """
    菜单表的创建序列化器
    """
    name = serializers.CharField(required=False)

    class Meta:
        model = Menu
        fields = "__all__"
        read_only_fields = ["id"]

    def create(self, validated_data):
        menu = super(MenuCreateSerializer, self).create(validated_data)
        if not menu.is_catalog and menu.is_dynamic:
            MenuButton.objects.bulk_create([MenuButton(**f) for f in [
                {'name': '新增', 'value': 'Create', 'api': f'{settings.DYNAMIC_API_PREFIX}{validated_data["code"]}/',
                 'method': 1, 'menu_id': menu.id},
                {'name': '编辑', 'value': 'Update',
                 'api': f'{settings.DYNAMIC_API_PREFIX}{validated_data["code"]}/' + '{id}/',
                 'method': 2, 'menu_id': menu.id},
                {'name': '查询', 'value': 'Search', 'api': f'{settings.DYNAMIC_API_PREFIX}{validated_data["code"]}/',
                 'method': 0, 'menu_id': menu.id},
                {'name': '单例', 'value': 'Retrieve',
                 'api': f'{settings.DYNAMIC_API_PREFIX}{validated_data["code"]}/' + '{id}/',
                 'method': 0, 'menu_id': menu.id},
                {'name': '删除', 'value': 'Delete',
                 'api': f'{settings.DYNAMIC_API_PREFIX}{validated_data["code"]}/' + '{id}/',
                 'method': 3, 'menu_id': menu.id},
            ]])
        return menu


class WebRouterSerializer(CustomModelSerializer):
    """
    前端菜单路由的简单序列化器
    """
    path = serializers.CharField(source="web_path")
    title = serializers.CharField(source="name")
    menuPermission = serializers.SerializerMethodField(read_only=True)

    def get_menuPermission(self, instance):
        # 判断是否是超级管理员
        if self.request.user.is_superuser:
            return Button.objects.values_list('value', flat=True)
        else:
            # 根据当前角色获取权限按钮id集合
            permissionIds = self.request.user.role.values_list('permission', flat=True)
            queryset = MenuButton.objects.filter(id__in=permissionIds, menu__id=instance.id).values_list('value',
                                                                                                         flat=True)
            if queryset:
                return queryset
            else:
                return None

    class Meta:
        model = Menu
        fields = '__all__'
        read_only_fields = ["id"]


class MenuViewSet(CustomModelViewSet):
    """
    菜单管理接口
    list:查询
    create:新增
    update:修改
    retrieve:单例
    destroy:删除
    """
    queryset = Menu.objects.all()
    serializer_class = MenuSerializer
    create_serializer_class = MenuCreateSerializer
    update_serializer_class = MenuCreateSerializer
    filter_fields = ('name', 'is_link', 'is_catalog', 'status', 'visible', 'cache')
    search_fields = ['name', 'status']
    extra_filter_backends = [MenuFilterBackend]

    def web_router(self, request):
        """用于前端获取当前角色的路由"""
        queryset = self.filter_queryset(self.queryset).filter(status=1)
        serializer = WebRouterSerializer(queryset, many=True, request=request)
        data = serializer.data
        return SuccessResponse(data=data, total=len(data), msg="获取成功")
